package gcp.cadastros;

import gcp.Usuario;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * CadastroUsuario<br>
 * Banco responsavel por manter os usuarios cadastrados.
 * @author Hildegard Furtado
 */
public class CadastroUsuario implements Serializable {

    private static final long serialVersionUID = 8317215445740806227L;

    private List<Usuario> usuarios;

    /**
     * Construtor default
     */
    public CadastroUsuario() {
        usuarios = new ArrayList<Usuario>();
    }

    /**
     * Adiciona um Usuario.
     * @param usuario Usuario a ser adicionado.
     * @throws Exception Lancada caso o usuario seja nulo.
     */
    public void addUsuario(Usuario usuario) throws Exception {
        if (usuario == null) {
            throw new Exception("Usuario nulo invalido");
        }
        if (get(usuario.getLogin()) != null) {
            throw new Exception("Usuario ja cadastrado");
        }
        usuarios.add(usuario);
    }

    /**
     * Retorna o Usuario.
     * @param login Login do usuario.
     * @return Usuario Usuario desejado.
     */
    public Usuario get(String login) {
        for (Usuario usuario : usuarios) {
            if (usuario.getLogin().equals(login)) {
                return usuario;
            }
        }
        return null;
    }

    /**
     * Remove o Usuario.
     * @param login do usuario a ser removido.
     * @throws Exception Lancada caso o login seja nulo.
     */
    public void removerUsuario(String login) throws Exception {
        if (login == null) {
            throw new Exception("Login invalido");
        }
        Usuario usuario = get(login);
        if (usuario == null) {
            throw new Exception("Usuario" + login + "inexistente");
        }
        usuarios.remove(usuario);
    }

    /**
     * Autentica a conta do Usuario.
     * @param login login do Usuario.
     * @param senha Senha do Usuario
     * @return usuario Usuario autenticado
     * @throws Exception lanca-a caso o Usuario nao exista ou a senha seja
     *             invalida para o Usuario dado
     */
    public Usuario autenticarUsuario(String login, String senha)
            throws Exception {
        Usuario usuario = get(login);
        if (usuario == null) {
            throw new Exception("Usuario" + login + "inexistente");
        }
        if (!usuario.getSenha().equals(senha)) {
            throw new Exception("Senha invalida para" + login);
        }
        return usuario;
    }

    /**
     * Retorna a quantidade de Usuarios do sistema.
     * @return O numero de usuarios do sistema.
     */
    public int getNumeroDeUsuarios() {
        return usuarios.size();
    }

    /**
     * Retorna os usuarios do sistema.
     * @return Os usuarios do sistema.
     */
    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    /**
     * Altera/define a lista de usuarios.
     * @param usuarios Usuarios a serem adicionados no sistema.
     */
    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }
}